package netty.test9nettySimple2;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;
import io.netty.util.concurrent.DefaultEventExecutor;
import io.netty.util.concurrent.DefaultEventExecutorGroup;
import io.netty.util.concurrent.EventExecutor;
import io.netty.util.concurrent.EventExecutorGroup;

import java.util.concurrent.Callable;

/**
 * 一： 处理耗时业务1，在handler中添加异步任务
 *
 *
 */
public class ServerHandler1 extends ChannelInboundHandlerAdapter {
    /**
     * group充当业务线程池，可以将业务提交到该线程池中。，这里创建了16个线程。
     */
    static final EventExecutorGroup group=new DefaultEventExecutorGroup(16);

    @Override
    public void channelRead(final ChannelHandlerContext ctx, final Object msg) throws Exception {
        ByteBuf but=(ByteBuf)msg;
        byte [] bt=new byte[but.readableBytes()];
        but.readBytes(bt);
        String s=new String(bt,CharsetUtil.UTF_8);
        System.out.println("ServerHandler1 主线程 当前线程。。。"+Thread.currentThread().getName()+"发送的消息为---"+s);
        group.submit(new Callable<Object>() {

            @Override
            public Object call() throws Exception {
               ByteBuf buf=(ByteBuf) msg;
               byte [] bytes=new byte[buf.readableBytes()];
               buf.readBytes(bytes);
               String body=new String(bytes,CharsetUtil.UTF_8);
               //休眠10ms模拟耗时操作
                Thread.sleep(10*1000);
                System.out.println("ServerHandler1 子线程--- 当前线程"+Thread.currentThread().getName());
                //给客户端回复一个消息
                ctx.writeAndFlush(Unpooled.copiedBuffer("hello 客服端。。。。。",CharsetUtil.UTF_8));
                return null;
            };
        });

        System.out.println("主线程执行完毕。。。。。。");
    }


    //2,数据读取完毕，后触发方法
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        //super.channelReadComplete(ctx);
        //把数据写到缓冲，然后刷新，一般来说这个地方要对发送的数据进行编码，
        ctx.writeAndFlush(Unpooled.copiedBuffer("我是服务器，读取消息完成",CharsetUtil.UTF_8));
    }

    //3,发生异常后，一般来说要关闭通道
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        System.out.println("客户端断开连接");
        ctx.channel().close();//用 ctx.close()也行
    }


}
